<?php

/**
 * Model che rappresenta una azienda rappresentata, nel DB.
 */
class AziendaRappresentata extends StdModel
{

	private static $singleton = NULL;

	/**
	 * Ritorna una istanza globale di questo model.
	 * @return mixed La istanza globale.
	 */
	public static function getInstance()
	{
		if(self::$singleton == NULL)
			self::$singleton = new AziendaRappresentata();
		return self::$singleton;
	}

	/*
	 * Specifiche attributi del tipo del Model rappresentato da questa classe
	 */
	public $attribTableName = "AziendaRappresentata";
	public $attribLabel = "Ragsoc";
	public $attribNames = array(STD_ID, "Ragsoc", "Indirizzo", "CAP", "Citta", "Provincia", "Stato",
			"PartitaIva", "CodiceFiscale", "Banca", "Iban", "Logo", "LogoMimeType",//il parametro  è segreto e non gestito
		"E_MailCommerciale", "E_MailTecnico", "E_MailAmministrativo", "E_MailPec");
	public $attribExcludeFromAdd = array(STD_ID, "Logo", "LogoMimeType");//il logo viene impostato a null inizialmente
	public $attribExcludeFromEdit = array(STD_ID, "Logo", "LogoMimeType");// il logo viene editato con una seconda query per evitare stringhe troppo lunghe
	public $attribLongNames = array(STD_ID => "ID", "Ragsoc" => "Ragione Sociale", "Indirizzo" => "Indirizzo",
		"CAP" => "CAP", "Citta" => "Citt&agrave;", "Provincia" => "Provincia", "Stato" => "Stato",
		"PartitaIva" => "Partita IVA", "CodiceFiscale" => "Codice fiscale", "Banca" => "Banca",
		"Iban" => "IBAN", "Logo" => "Logo", "LogoMimeType" => "Tipo immagine",
		"E_MailCommerciale" => "E-Mail Commerciale", "E_MailTecnico" => "E-Mail Tecnico",
		"E_MailAmministrativo" => "E-Mail Amministrativo", "E_MailPec" => "E-Mail Pec");
	public $attribIsImportant = array(STD_ID => 2, "Ragsoc" => 1, "Indirizzo" => 1, "CAP" => 1, "Citta" => 1,
		"Provincia" => 1, "Stato" => 1, "PartitaIva" => 0, "CodiceFiscale" => 0, "Banca" => 0, "Iban" => 0, "Logo" => 0, "LogoMimeType" => 0,
		"E_MailCommerciale" => 0, "E_MailTecnico" => 0, "E_MailAmministrativo" => 0, "E_MailPec" => 0);
	public $attribIsNumeric = array(STD_ID => true, "Ragsoc" => false, "Indirizzo" => false, "CAP" => false,
		"Citta" => false, "Provincia" => false, "Stato" => false, "PartitaIva" => false, "CodiceFiscale" => false,
		"Banca" => false, "Iban" => false, "Logo" => false, "LogoMimeType" => false, "E_MailCommerciale" => false,
		"E_MailTecnico" => false, "E_MailAmministrativo" => false, "E_MailPec" => false);
	public $attribIsForeignKey = array(STD_ID => false, "Ragsoc" => false, "Indirizzo" => false, "CAP" => false,
		"Citta" => false, "Provincia" => false, "Stato" => false, "PartitaIva" => false, "CodiceFiscale" => false,
		"Banca" => false, "Iban" => false, "Logo" => false, "LogoMimeType" => false, "E_MailCommerciale" => false, "E_MailTecnico" => false,
		"E_MailAmministrativo" => false, "E_MailPec" => false);

	/*
	 * Specifiche per gli elementi form associati agli attributi
	 */
	private static $attribHTMLFormValue = array(STD_ID => FORM_HIDDEN, "Ragsoc" => FORM_TEXT, "Indirizzo" => FORM_TEXT,
		"CAP" => FORM_TEXT, "Citta" => FORM_TEXT, "Provincia" => FORM_TEXT, "Stato" => FORM_TEXT, "PartitaIva" => FORM_TEXT,
		"CodiceFiscale" => FORM_TEXT, "Banca" => FORM_TEXT, "Iban" => FORM_TEXT, "Logo" => FORM_UPLOAD_FILE, "LogoMimeType" => FORM_HIDDEN,
		"E_MailCommerciale" => FORM_TEXT, "E_MailTecnico" => FORM_TEXT, "E_MailAmministrativo" => FORM_TEXT, "E_MailPec" => FORM_TEXT);
	private static $attribHTMLFormIsMandatory = array(STD_ID => true, "Ragsoc" => true, "Indirizzo" => false,
		"CAP" => false, "Citta" => false, "Provincia" => false, "Stato" => false, "PartitaIva" => false, "CodiceFiscale" => false,
		"Banca" => false, "Iban" => false, "Logo" => false, "LogoMimeType" => false, "E_MailCommerciale" => false,
		"E_MailTecnico" => false, "E_MailAmministrativo" => false, "E_MailPec" => false);

	/**
	 * Restituisce l'HTML per creare un campo di un form adatto a contenere il
	 * valore dell'attribbuto passato. Questo campo di testo sarà vuoto e dovrà
	 * servire per la creazione di una nuova istanza in DB di questo model.
	 * @param string $attribName Nome dell'attributo su cui creare il campo.
	 * @return string Stringa contenente l'HTML dell'elemento creato.
	 */
	public function getAddFormCodeFromAttribute($db,$attribName)
	{
		if(!isset(self::$attribHTMLFormValue[$attribName]) || $attribName == STD_ID || $attribName == "Logo" || $attribName == "LogoMimeType")
			return "";
		switch(self::$attribHTMLFormValue[$attribName])
		{
			case FORM_TEXT: return ModelUtils::getTextFormElement($attribName, "", self::$attribHTMLFormIsMandatory[$attribName]);
			//case FORM_UPLOAD_FILE: return ModelUtils::getFileUploadFormElement($attribName, "image/jpg, image/png", self::$attribHTMLFormIsMandatory[$attribName], ModelUtils::MAX_UPLOAD_ALLOWED);
			default: return "";
		}
	}

	/**
	 * Restituisce l'HTML per creare un campo di testo adatto a contenere il
	 * valore dell'attribbuto passato. Questo campo di testo conterrà il valore
	 * attualmente assunto da questo attributo in questa tupla.
	 * @param DatabaseManager $db Database su cui effettuare una possibile
	 * interrogazione.
	 * @param string $attribName Nome dell'attributo di cui creare il codice.
	 * @return string Il codice HTML dell'elemento form corrispondente.
	 */
	public function getEditFormCodeFromAttribute($db, $attribName)
	{
		switch(self::$attribHTMLFormValue[$attribName])
		{
			case FORM_HIDDEN: return ModelUtils::getHiddenFormElement($attribName, $this->dataTupla[$attribName], self::$attribHTMLFormIsMandatory[$attribName]);
			case FORM_TEXT: return ModelUtils::getTextFormElement($attribName, $this->dataTupla[$attribName], self::$attribHTMLFormIsMandatory[$attribName]);
			case FORM_UPLOAD_FILE: return ModelUtils::getFileUploadFormElement($attribName, "image/jpeg, image/png", self::$attribHTMLFormIsMandatory[$attribName], ModelUtils::MAX_UPLOAD_ALLOWED);
			default: return "";
		}
	}

	/**
	 * Costruttore che acquisisce l'array dei valori associativi.
	 * @param type $data L'array associativo a cui inizializzare questa istanza.
	 */
	public function __construct($data = NULL)
	{
		parent::__construct($data);
		if(isset($_FILES['Logo']) && ($_FILES['Logo']["error"] == UPLOAD_ERR_OK) && (is_uploaded_file($_FILES['Logo']['tmp_name'])))
		{
			$logoFile = ModelUtils::getFileFromFormFileUploadRequest("Logo", true, array(".png", ".jpg", "image/jpeg", "image/png"));
			if($logoFile instanceof UploadedFile)
			{
				$this->dataTupla["Logo"] = $logoFile->fileContent;
				$this->dataTupla["LogoMimeType"] = $logoFile->fileType;
			}
			else
				die(htmlentities (ModelUtils::getFileUploadErrorMessage ($logoFile)));
		}
	}

	/**
	 * Crea una nuova istanza della sottoclasse specializzante.
	 * @param array $data I dati passati da cui recuperare i valori.
	 * @return mixed Una nuova instanza della sottoclasse specializzante.
	 */
	public function createNew($data)
	{
		return new AziendaRappresentata($data);
	}

	/**
	 * Impostare a "true" se si vuole che vengano caricate le info sul logo.
	 * @var bool Impostare a "true" se si vuole che vengano caricate le info sul
	 * logo.
	 */
	public $loadLogoInfos = false;

	/**
	 * Carica una nuova istanza con i valori di una specifica tupla del DB.
	 * @param DatabaseManager $db Database da cui prelevare la tupla.
	 * @param long $id Identificatore univoco che indica la tupla da prelevare.
	 * @return mixed Ritorna la nuova istanza se il caricamento dei valori è
	 * andato a buon fine, NULL altrimenti.
	 */
	public function getFromDB($db, $id)
	{
		//if($this->loadLogoInfosToo)
			//return parent::getFromDB($db, $id);
		$attribNamesStr = "";
		if(!$this->loadLogoInfos)
		{
			foreach($this->attribNames as $attr)
			{
				if($attr == "Logo")// || $attr == "LogoMimeType"
					continue;
				if($attribNamesStr == "")
					$attribNamesStr = $attr;
				else
					$attribNamesStr .= ", ".$attr;
			}
		}
		else
		{
			$attribNamesStr = "Logo, LogoMimeType";
		}
		$newdata = $db->GetRecord($this->attribTableName,$attribNamesStr,STD_ID." = ".$id);
		if($newdata == NULL)
			return NULL;
		return $this->createNew($newdata);
	}

	/**
	 * Carica dal DB una lista di istanze di questa sottoclasse caricate con i
	 * valori delle tuple trovate secondo le specifiche passate.
	 * @param DatabaseManager $db Database da cui prelevare le tuple.
	 * @param int $limitMin Limite basso da cui iniziare a prelevare tuple, o
	 * NULL per non usare i limiti.
	 * @param int $limitMax Limite alto a cui fermarsi di prelevare tuple, o
	 * NULL per non usare i limiti.
	 * @param string $orderBy Ordinamento con cui prelevare le tuple, o "" per
	 * non usare alcun ordinamento.
	 * @return array L'array delle nuove istanze create a partire dai valori
	 * trovati nel DB o NULL nel caso qualcosa sia andato storto.
	 */
	public function getListFromDB($db, $limitMin, $limitMax, $orderBy, $cond = "")
	{
		$limits = ($limitMin === NULL || $limitMax === NULL ? "" : ($limitMin.", ".($limitMax-$limitMin)) );
		if($orderBy == NULL || $orderBy == "")
			$orderBy = STD_ID." DESC";
		$attribNamesStr = "";
		foreach($this->attribNames as $attr)
		{
			if($attr == "Logo")// || $attr == "LogoMimeType"
				continue;
			if($attribNamesStr == "")
				$attribNamesStr = $attr;
			else
				$attribNamesStr .= ", ".$attr;
		}
		$rs = $db->EnumerateTableStartExt($attribNamesStr,$this->attribTableName,$orderBy,$cond,$limits);
		if($rs == FALSE)
			return NULL;
		$retarr = array();
		while($db->EnumerateTableNext($rs))
			$retarr[] = $this->createNew($db->EnumerateTableGetValues($rs));
		return $retarr;
	}

	/**
	 * Aggiorna I dati nel DB con quelli di questa istanza.
	 * @param DatabaseManager $db Database su cui effettuare l'UPDATE.
	 * @return boolean Restituisce vero se l'UPDATE è andato a buon fine, falso
	 * altrimenti.
	 */
	public function updateDB($db)
	{
		$succ = parent::updateDB($db);
		if(isset($this->dataTupla["LogoMimeType"]) && $this->dataTupla["Logo"] != NULL && $succ != FALSE)
		{
			$values = "LogoMimeType = '".$this->dataTupla["LogoMimeType"]."', Logo = '".addslashes($this->dataTupla["Logo"])."'";
			return $db->UpdateRecord($this->attribTableName,$values,STD_ID." = ".$this->dataTupla[STD_ID]);
		}
		return $succ;
	}

	/**
	 * Restituisce gli attributi su cui è possibile effettuare una ricerca,
	 * nella forma array "nomeAttributo => nomeLungoAttributo".
	 * @return array L'array di attrubuti su cui è possibile effettuare una
	 * ricerca.
	 */
	public function getSearchableAttributes()
	{
		$newarr = array();
		foreach($this->attribLongNames as $k => $v)
		{
			if($k == "Logo" || $k == "LogoMimeType")
				continue;
			$newarr[$k] = $v;
		}
		return $newarr;
	}

	/**
	 * Restituisce l'etichetta dell'attributo Logo.
	 * @param string $otherImgAttributes Altri opzionali attributi dell'elemento
	 * HTML "img".
	 * @return string L'etichetta dell'attributo Logo.
	 */
	public function getLogoDataLabel($otherImgAttributes = "")
	{
		return "<img src=\"Model/showAziendaRappresentataLogo.php?ID=".$this->dataTupla[STD_ID]."\" ".$otherImgAttributes." />";
	}

	/**
	 * Metodo che restituisce una etichetta che rappresenta il valore di un
	 * attributo: nella sua versione di default ritorna esattamente il valore
	 * associato a quell'attributo, ma è possibile implementarlo nelle
	 * sottoclassi per specificare opportuni comportamenti, come ad esempio di
	 * non far stampare un numero che rappresenta una chiave esterna, ma invece
	 * una etichetta della tupla ad essa associata.
	 * @param DatabaseManager $db Database su cui poter effettuare una possibile
	 * interrogazione.
	 * @param string $attrib Attributo di cui stampare l'etichetta del valore.
	 * @return string Il valore associato all'attributo o NULL se l'attributo
	 * non è stato trovato.
	 */
	public function getDataLabel($db, $attrib)
	{
		if($attrib == "Logo")
			return $this->getLogoDataLabel("width=\"256\"");
		return parent::getDataLabel($db, $attrib);
	}

}

?>
